package controlador;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.PasswordAuthentication;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.HashMap;

import javax.sql.DataSource;

import Modelo.Asistente;
import Modelo.Conferencia;
import Modelo.Conferencia_asistente;
import Modelo.Conferencista;
import net.sourceforge.pbeans.Store;
import net.sourceforge.pbeans.StoreException;
import net.sourceforge.pbeans.data.GenericDataSource;
import net.sourceforge.pbeans.data.ResultsIterator;
import Modelo.*;

public class Controlador {

	String shortcode;
	String pass;
	String server;
	DataSource dataSource;
	Store baseDeDatos;

	/**
	 * Controlador para el envio de mensajes
	 * 
	 * @param pass
	 *            , es el password de la broker ej:first
	 * @param shortcode
	 *            , shorcode autorizado ej:2020
	 * @param server
	 *            , Url del servidor ej:http://192.168.101.4:8080/broker
	 * @param dbUrl
	 *            , Url de la base de datos
	 *            ej:jdbc:mysql://localhost/moviles?user=root&password=
	 */

	public Controlador(String pass, String shortcode, String server,
			String dbUrl) {
		this.pass = pass;
		this.shortcode = shortcode;
		this.server = server;

		try {
			dataSource = new GenericDataSource("com.mysql.jdbc.Driver", dbUrl);
			baseDeDatos = new Store(dataSource);
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (StoreException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/**
	 * Programa el mensaje recibiendo una fecha
	 * 
	 * @param destinos
	 *            , numeros celulares separados por comas
	 * @param mensaje
	 *            , mensaje a enviar
	 * @param fecha
	 *            , fecha de envio formato:2010-09-17 15:15
	 * @param nombres
	 *            nombres de las personas deben estar en el orden de los
	 *            celulares
	 * @param personalizado
	 *            si true, adiciona el nombre al inicio del mensaje
	 */
	public void programarMensaje(String destinos, String mensaje, String fecha,
			String nombres, boolean personalizado) {
		Thread hiloMensaje = new Thread(new Temporizador(mensaje, destinos,
				nombres, fecha, shortcode, pass, server, personalizado), "Hilo");
		hiloMensaje.start();

	}

	/**
	 * Programa un envio de mensaje a todos los asistentes a una conferencia
	 * 
	 * @param conferencia
	 *            , recibe la cedula del conferencista como identificador
	 * @param mensaje
	 *            , mensaje a enviar
	 * @param personalizado
	 *            , si true envia el nombre al inicio del mensaje
	 * @param fecha
	 *            , fecha a enviar el mensaje
	 */
	public void programarMasivo(String conferencia, String mensaje,
			boolean personalizado, String fecha) {


		try {

			HashMap<String, String> valoresABuscar = new HashMap<String, String>();
			valoresABuscar.put("cod_conferencia", conferencia);
			ResultsIterator ri2 = baseDeDatos.select(
					Conferencia_asistente.class, valoresABuscar);

			// ResultsIterator ri2 =
			// baseDeDatos.select(Conferencia_asistente.class,
			// "SELECT * FROM conferencia_asistente where cod_conferencia='"+conferencia+"'",
			// new Object[0]);

			try {
				System.out.println("Programando Mensaje Masivo");
				int contador = 0;
				String numeros = "";
				String nombres = "";
				while (ri2.hasNext()) {
					Conferencia_asistente casistente = (Conferencia_asistente) ri2
							.next();
					System.out.println("conferencia cod"
							+ casistente.getCod_conferencia());
					Asistente asistente = casistente.getCod_asistente();
					numeros = numeros + asistente.getCelular() + ",";
					nombres = nombres + asistente.getNombre() + ",";
					contador++;

				}
				System.out.println(contador + " Mensajes Programados para: "
						+ fecha);
				programarMensaje(numeros, mensaje, fecha, nombres,
						personalizado);
			} finally {
				ri2.close();
			}

		} catch (StoreException e1) {

			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
	}

	public void enviarMasivo(String conferencia, String mensaje,
			boolean personalizado) {

		try {

			HashMap<String, String> valoresABuscar = new HashMap<String, String>();
			valoresABuscar.put("conf", conferencia);
			ResultsIterator ri2 = baseDeDatos.select(Asistente.class,
					valoresABuscar);
			try {
				System.out.println("Enviando Mensaje Masivo");
				int contador = 0;
				while (ri2.hasNext()) {
					Conferencia_asistente casist = (Conferencia_asistente) ri2
							.next();
					Asistente asistente = casist.getCod_asistente();
					System.out.println("Asistente encontrado: "
							+ asistente.getNombre());

					if (personalizado) {

						System.out.println(enviarMensaje(
								asistente.getCelular(), asistente.getNombre()
										+ ", " + mensaje));
					} else {

						System.out.println(enviarMensaje(
								asistente.getCelular(), mensaje));

					}

					// System.out.println(contador+" Mensajes enviados");

				}
			} finally {
				ri2.close();
			}

		} catch (StoreException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

	}
	
	public void enviarMensajeGenerico(String conferencia, String mensaje,
			boolean personalizado) {

		try {

			HashMap<String, String> valoresABuscar = new HashMap<String, String>();
			valoresABuscar.put("conf", conferencia);
			ResultsIterator ri2 = baseDeDatos.select(Asistente.class,
					valoresABuscar);
			try {
				System.out.println("Enviando Mensaje Masivo");
				int contador = 0;
				while (ri2.hasNext()) {
					Conferencia_asistente casist = (Conferencia_asistente) ri2
							.next();
					Asistente asistente = casist.getCod_asistente();
					System.out.println("Asistente encontrado: "
							+ asistente.getNombre());

					if (personalizado) {

						System.out.println(enviarMensaje(
								asistente.getCelular(), asistente.getNombre()
										+ ", " + mensaje));
					} else {

						System.out.println(enviarMensaje(
								asistente.getCelular(), mensaje));

					}

					// System.out.println(contador+" Mensajes enviados");

				}
			} finally {
				ri2.close();
			}

		} catch (StoreException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

	}

	public String enviarMensaje(String celular, String mensaje) {
		String result = "";

		try {
			// Construct data
			String data = URLEncoder.encode("shortcode", "UTF-8") + "="
					+ URLEncoder.encode(shortcode, "UTF-8");
			data += "&" + URLEncoder.encode("password", "UTF-8") + "="
					+ URLEncoder.encode(pass, "UTF-8");
			data += "&" + URLEncoder.encode("destinos", "UTF-8") + "="
					+ URLEncoder.encode(celular, "UTF-8");
			data += "&" + URLEncoder.encode("contenido", "UTF-8") + "="
					+ URLEncoder.encode(mensaje, "UTF-8");

			// Send data
			URL url = new URL(server + "/brokerSend");
			URLConnection conn = url.openConnection();
			conn.setDoOutput(true);
			OutputStreamWriter wr = new OutputStreamWriter(
					conn.getOutputStream());
			wr.write(data);
			wr.flush();

			// Get the response
			BufferedReader rd = new BufferedReader(new InputStreamReader(
					conn.getInputStream()));
			String line;
			while ((line = rd.readLine()) != null) {
				result = result + line + "\n";
			}
			wr.close();
			rd.close();
		} catch (Exception e) {
			result = "error";
		}

		return result;

	}

	public String verificarCuenta() {
		String result = "";
		try {
			// Construct data
			String data = URLEncoder.encode("shortcode", "UTF-8") + "="
					+ URLEncoder.encode(shortcode, "UTF-8");
			data += "&" + URLEncoder.encode("password", "UTF-8") + "="
					+ URLEncoder.encode(pass, "UTF-8");

			// Send data
			URL url = new URL(server + "/brokerAccount");
			URLConnection conn = url.openConnection();
			conn.setDoOutput(true);
			OutputStreamWriter wr = new OutputStreamWriter(
					conn.getOutputStream());
			wr.write(data);
			wr.flush();

			// Get the response
			BufferedReader rd = new BufferedReader(new InputStreamReader(
					conn.getInputStream()));
			String line;

			while ((line = rd.readLine()) != null) {

				result = result + line + "\n";
			}
			wr.close();
			rd.close();
		} catch (Exception e) {
		}
		return result;

	}
}
